{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第三步：调整树的参数：subsample 和 colsample_bytree"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 导入工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "import seaborn as sns\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.导入数据 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "dpath = \"./data/\"\n",
    "data = pd.read_csv(dpath + \"RentListingInquries_FE_train.csv\")\n",
    "# data_test = pd.read_csv(dpath + \"RentListingInquries_FE_test.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data train:  (16779, 228)\n"
     ]
    }
   ],
   "source": [
    "# 取三分之一的数据作为训练集\n",
    "data_train, data_val = train_test_split(data, test_size = 0.66,random_state = 0)\n",
    "print(\"data train: \",data_train.shape)\n",
    "# print(\"data test: \",data_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>1.677900e+04</td>\n",
       "      <td>1.677900e+04</td>\n",
       "      <td>1.677900e+04</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.0</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "      <td>16779.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>1.209071</td>\n",
       "      <td>1.537994</td>\n",
       "      <td>4.002467e+03</td>\n",
       "      <td>1.784611e+03</td>\n",
       "      <td>1.718569e+03</td>\n",
       "      <td>-0.328923</td>\n",
       "      <td>2.747065</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>5.009476</td>\n",
       "      <td>15.247631</td>\n",
       "      <td>...</td>\n",
       "      <td>0.002920</td>\n",
       "      <td>0.000298</td>\n",
       "      <td>0.184397</td>\n",
       "      <td>0.008940</td>\n",
       "      <td>0.000536</td>\n",
       "      <td>0.027773</td>\n",
       "      <td>0.001788</td>\n",
       "      <td>0.000894</td>\n",
       "      <td>0.000954</td>\n",
       "      <td>1.616485</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.495244</td>\n",
       "      <td>1.115954</td>\n",
       "      <td>3.569312e+04</td>\n",
       "      <td>1.781989e+04</td>\n",
       "      <td>1.228794e+04</td>\n",
       "      <td>0.949059</td>\n",
       "      <td>1.442402</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.824854</td>\n",
       "      <td>8.341423</td>\n",
       "      <td>...</td>\n",
       "      <td>0.053963</td>\n",
       "      <td>0.017260</td>\n",
       "      <td>0.387819</td>\n",
       "      <td>0.099066</td>\n",
       "      <td>0.023154</td>\n",
       "      <td>0.164326</td>\n",
       "      <td>0.042248</td>\n",
       "      <td>0.029887</td>\n",
       "      <td>0.030866</td>\n",
       "      <td>0.625818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.500000e+01</td>\n",
       "      <td>2.250000e+01</td>\n",
       "      <td>4.500000e+01</td>\n",
       "      <td>-4.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.498000e+03</td>\n",
       "      <td>1.225000e+03</td>\n",
       "      <td>1.066667e+03</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.150000e+03</td>\n",
       "      <td>1.500000e+03</td>\n",
       "      <td>1.397500e+03</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>15.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>4.100000e+03</td>\n",
       "      <td>1.850000e+03</td>\n",
       "      <td>1.962500e+03</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>4.490000e+06</td>\n",
       "      <td>2.245000e+06</td>\n",
       "      <td>1.496667e+06</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>31.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          bathrooms      bedrooms         price  price_bathrooms  \\\n",
       "count  16779.000000  16779.000000  1.677900e+04     1.677900e+04   \n",
       "mean       1.209071      1.537994  4.002467e+03     1.784611e+03   \n",
       "std        0.495244      1.115954  3.569312e+04     1.781989e+04   \n",
       "min        0.000000      0.000000  4.500000e+01     2.250000e+01   \n",
       "25%        1.000000      1.000000  2.498000e+03     1.225000e+03   \n",
       "50%        1.000000      1.000000  3.150000e+03     1.500000e+03   \n",
       "75%        1.000000      2.000000  4.100000e+03     1.850000e+03   \n",
       "max        6.000000      8.000000  4.490000e+06     2.245000e+06   \n",
       "\n",
       "       price_bedrooms     room_diff      room_num     Year         Month  \\\n",
       "count    1.677900e+04  16779.000000  16779.000000  16779.0  16779.000000   \n",
       "mean     1.718569e+03     -0.328923      2.747065   2016.0      5.009476   \n",
       "std      1.228794e+04      0.949059      1.442402      0.0      0.824854   \n",
       "min      4.500000e+01     -4.000000      0.000000   2016.0      4.000000   \n",
       "25%      1.066667e+03     -1.000000      2.000000   2016.0      4.000000   \n",
       "50%      1.397500e+03      0.000000      2.000000   2016.0      5.000000   \n",
       "75%      1.962500e+03      0.000000      4.000000   2016.0      6.000000   \n",
       "max      1.496667e+06      2.000000     12.000000   2016.0      6.000000   \n",
       "\n",
       "                Day       ...                walk         walls           war  \\\n",
       "count  16779.000000       ...        16779.000000  16779.000000  16779.000000   \n",
       "mean      15.247631       ...            0.002920      0.000298      0.184397   \n",
       "std        8.341423       ...            0.053963      0.017260      0.387819   \n",
       "min        1.000000       ...            0.000000      0.000000      0.000000   \n",
       "25%        8.000000       ...            0.000000      0.000000      0.000000   \n",
       "50%       15.000000       ...            0.000000      0.000000      0.000000   \n",
       "75%       22.000000       ...            0.000000      0.000000      0.000000   \n",
       "max       31.000000       ...            1.000000      1.000000      1.000000   \n",
       "\n",
       "             washer         water    wheelchair          wifi       windows  \\\n",
       "count  16779.000000  16779.000000  16779.000000  16779.000000  16779.000000   \n",
       "mean       0.008940      0.000536      0.027773      0.001788      0.000894   \n",
       "std        0.099066      0.023154      0.164326      0.042248      0.029887   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "max        2.000000      1.000000      1.000000      1.000000      1.000000   \n",
       "\n",
       "               work  interest_level  \n",
       "count  16779.000000    16779.000000  \n",
       "mean       0.000954        1.616485  \n",
       "std        0.030866        0.625818  \n",
       "min        0.000000        0.000000  \n",
       "25%        0.000000        1.000000  \n",
       "50%        0.000000        2.000000  \n",
       "75%        0.000000        2.000000  \n",
       "max        1.000000        2.000000  \n",
       "\n",
       "[8 rows x 228 columns]"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'Interest level')"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x9d2a1a6128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(data_train.interest_level)\n",
    "plt.xlabel(\"Number of occurrences\")\n",
    "plt.ylabel(\"Interest level\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "样本分布不均，大部分是不感兴趣"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 调用xgboost中的cv调整subsample 和 colsample_bytree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "kfold = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分离 X 和 y\n",
    "y_train = data_train[\"interest_level\"]\n",
    "X_train = data_train.drop(\"interest_level\", axis = 1)\n",
    "\n",
    "# X_test = data_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "def modelfit(alg, X_train, y_train, i, j, cv_folds = None, early_stopping_rounds = 10):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param[\"num_class\"] = 3\n",
    "    xgb_param[\"subsample\"] = i\n",
    "    xgb_param[\"colsample_bytree\"] = j\n",
    "    # 把数据转为DMatrix\n",
    "    xg_train = xgb.DMatrix(X_train, label = y_train)\n",
    "    \n",
    "    # 交叉验证，获取结果\n",
    "    cv_result = xgb.cv(xgb_param, xg_train, num_boost_round = alg.get_params()['n_estimators'], folds = cv_folds,\n",
    "                      metrics = \"mlogloss\", early_stopping_rounds = early_stopping_rounds)\n",
    "    \n",
    "    # 将结果保存为csv文件\n",
    "    cv_result.to_csv(\"subsamples_\"+ str(i) + \"_\" + str(j) + \".csv\", index_label = \"index\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构建分类器\n",
    "xgb4 = XGBClassifier(\n",
    "        learning_rate = 0.1,\n",
    "        n_estimators = 116,  # 第一轮调整获取的最优值\n",
    "        max_depth = 5,  # 第二轮调整获取的最优值\n",
    "        min_child_weight = 1,  # 第三轮调整获取的最优值\n",
    "        gamma = 0,\n",
    "        subsample = 0.3,\n",
    "        colsample_bytree = 0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective = \"multi:softprob\",\n",
    "        nthread = 2, # 多线程\n",
    "        seed = 6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置搜索范围\n",
    "subsample = [0.3, 0.5, 0.7, 0.9]\n",
    "colsample_bytree = [i/10.0 for i in range(4,10,2)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对每组参数调用modelfit，保存结果\n",
    "for i in subsample:\n",
    "    for j in colsample_bytree:\n",
    "        modelfit(xgb4, X_train, y_train, i, j, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>test-mlogloss-mean</th>\n",
       "      <th>test-mlogloss-std</th>\n",
       "      <th>train-mlogloss-mean</th>\n",
       "      <th>train-mlogloss-std</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.623567</td>\n",
       "      <td>0.002350</td>\n",
       "      <td>0.517673</td>\n",
       "      <td>0.000442</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.621038</td>\n",
       "      <td>0.001139</td>\n",
       "      <td>0.502520</td>\n",
       "      <td>0.001986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.619069</td>\n",
       "      <td>0.002277</td>\n",
       "      <td>0.493779</td>\n",
       "      <td>0.000310</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.619304</td>\n",
       "      <td>0.002452</td>\n",
       "      <td>0.506697</td>\n",
       "      <td>0.000986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.616881</td>\n",
       "      <td>0.001240</td>\n",
       "      <td>0.493675</td>\n",
       "      <td>0.001796</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.614663</td>\n",
       "      <td>0.002105</td>\n",
       "      <td>0.484932</td>\n",
       "      <td>0.000554</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.616841</td>\n",
       "      <td>0.001607</td>\n",
       "      <td>0.502875</td>\n",
       "      <td>0.001059</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.615457</td>\n",
       "      <td>0.002986</td>\n",
       "      <td>0.489466</td>\n",
       "      <td>0.001061</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.613463</td>\n",
       "      <td>0.001821</td>\n",
       "      <td>0.480889</td>\n",
       "      <td>0.000366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.614748</td>\n",
       "      <td>0.002864</td>\n",
       "      <td>0.500181</td>\n",
       "      <td>0.001006</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0.614938</td>\n",
       "      <td>0.001926</td>\n",
       "      <td>0.491102</td>\n",
       "      <td>0.002397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0.613666</td>\n",
       "      <td>0.003111</td>\n",
       "      <td>0.483841</td>\n",
       "      <td>0.000553</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    test-mlogloss-mean  test-mlogloss-std  train-mlogloss-mean  \\\n",
       "0             0.623567           0.002350             0.517673   \n",
       "1             0.621038           0.001139             0.502520   \n",
       "2             0.619069           0.002277             0.493779   \n",
       "3             0.619304           0.002452             0.506697   \n",
       "4             0.616881           0.001240             0.493675   \n",
       "5             0.614663           0.002105             0.484932   \n",
       "6             0.616841           0.001607             0.502875   \n",
       "7             0.615457           0.002986             0.489466   \n",
       "8             0.613463           0.001821             0.480889   \n",
       "9             0.614748           0.002864             0.500181   \n",
       "10            0.614938           0.001926             0.491102   \n",
       "11            0.613666           0.003111             0.483841   \n",
       "\n",
       "    train-mlogloss-std  \n",
       "0             0.000442  \n",
       "1             0.001986  \n",
       "2             0.000310  \n",
       "3             0.000986  \n",
       "4             0.001796  \n",
       "5             0.000554  \n",
       "6             0.001059  \n",
       "7             0.001061  \n",
       "8             0.000366  \n",
       "9             0.001006  \n",
       "10            0.002397  \n",
       "11            0.000553  "
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 取出cv结果\n",
    "cv_result = pd.DataFrame({\"test-mlogloss-mean\":[],\"test-mlogloss-std\":[],\"train-mlogloss-mean\":[],\"train-mlogloss-std\":[]})\n",
    "for i in subsample:\n",
    "    for j in colsample_bytree:\n",
    "        # 读取文件\n",
    "        cv_result_temp = pd.read_csv(\"subsamples_\"+ str(i) + \"_\" + str(j) + \".csv\")\n",
    "        # 拼接\n",
    "        cv_result = pd.concat([cv_result,cv_result_temp.iloc[cv_result_temp.shape[0] - 1].drop(\"index\").to_frame().T])\n",
    "\n",
    "cv_result = cv_result.reset_index().drop(\"index\",axis = 1)\n",
    "cv_result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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83nxxRd56KGHeOmll7q0CQwM5N133yUkJIS2tjYuuugili9fzvz58wc0Fu3RKDVCNbY6+OBAJT99ex/XPvUR531/A1/643ae/fshAvx8eGBRGn/552w+/d7lvHRvDl+/LIPslCgC/Xy9HToPP/wwBQUFzJ49m29+85v8x3/8B3PnzmXWrFnuv7obGhpYuXIl5513HpmZmbz00kv86le/4tixYyxatIhFixZ1e2yn08mdd95JZmYmM2fO5Be/+AXQtcdQVVVFUlKSe58jR46wbNkypkyZwve///0e3x/giSeeYO7cuWRmZrJ69Wral/lauHAh3/jGN7jkkkuYNm0a27dv57rrriM9PZ3vfOc7ABQVFTF16lTuuOMOZs2axQ033NBt72zDhg3k5ORw/vnnc+ONN1JfX39am9dff5077rgDgBtuuIHNmzdz6pJjxhhCQkIA65b2trY2j4y3aY9GqRGiuc3Jx4ePuydIflJSS5tT8PMxzEoI475LU8hJieaCyRGMCeh7Mvn+/33G3mMnBjTW6RPG8fhVM3p8fc2aNezZs4ddu3axYcMGXnnlFXJzcxERrr76aj744AMqKyuZMGECb731FgB1dXWEhYXx85//nPfee4/o6Ohuj71r1y6OHj3Knj17AKv31Jvc3Fz27NnD2LFjmTt3LitXruTw4cOnvT/AAw88wHe/+10Abr/9dt58802uuuoqAAICAvjggw/45S9/yTXXXMOOHTuIjIwkNTWVb3zjGwDs37+fZ555hgULFnDXXXfx1FNP8eCDD7pjqaqq4oc//CGbNm0iODiYn/zkJ/z85z/nu9/9Lt/97nfJysri6quv5ujRo0yaZFVN8fPzIywsjOrq6tPOi9Pp5IILLiA/P5/777+f7OzsXs9Hf2miUWqYam5zdqp7X82u4lpanVbd+5kJ4dx9UQo5qVFkTY4gOHD4/lffsGEDGzZsYM6cOQDU19dz8OBBLr74Yh588EEeeughrrzySi6++OI+HS8lJYXCwkK++tWvsnLlSi6//PJe91m6dClRUVEAXHfddfz9739nxYoV3b7/e++9x09/+lMaGxupqalhxowZ7kRz9dVXAzBz5kxmzJhBfHy8O6YjR44QHh7OpEmTWLBgAQCrVq3iV7/6VZdEs3XrVvbu3etu09raSk5ODmD1ptp1t2Byd70VX19fdu3aRW1tLddeey179uwhMzOz13PSH8P3p0+pUabV4eITu+79loJqPi4+TovDSiwzJoRx54Ik5qdEMjcpktCggat7f6aex2AQER555BHuvffe017bsWMH69at45FHHuHyyy939yTOJCIigk8++YR33nmH3/zmN7z88ss8++yz+Pn54XJZ5a1OXRHh1F/QxhgyMjJOe/9vfetbfOUrXyEvL49Jkybxve99r8uxAgOtImw+Pj7ux+3PHQ5Hj+916vlYunQpL7zwwhk/Z0JCAkeOHCEhIQGHw0FdXR2RkZE9tg8PD2fhwoW8/fbbmmiUGi1cLuGTklr+YSeWvMM1NLe5MAamxY1j1fzJzLfLE4eNGbjEMhSEhoZy8uRJAK644goee+wxbrvtNkJCQjh69Cj+/v44HA4iIyNZtWoVISEhrF27tsu+PV06q6qqIiAggOuvv57U1FTuvPNOAJKSktixYwfz5s3jlVde6bLPxo0bqampYcyYMbz22ms8++yzHDt27LT3b08q0dHR1NfX88orr3DDDTf067MXFxezZcsWcnJyeOGFF7jooou6vD5//nzuv/9+8vPzSUtLo7GxkZKSEjIyMrq0u/rqq3nuuefIycnhlVdeYfHixaclrcrKSvz9/QkPD6epqYlNmzbx0EMP9SvevtBEo9QQ4nC6yD1Uw/o9ZbzzWZl76fypcaF8cW6iXewrkvCxAV6O1LOioqJYsGABmZmZLF++nFtvvdV9eSgkJIT//u//Jj8/n29+85v4+Pjg7+/Pb3/7WwBWr17N8uXLiY+P57333jvt2EePHuVLX/qSu/fy4x//GIAHH3yQm266iT/96U8sXry4yz4XXXQRt99+O/n5+dx6661kZWXxzjvvnPb+4eHh/PM//zMzZ84kKSmJuXPn9vuzT5s2jeeee457772X9PR0vvzlL3d5PSYmhrVr13LLLbfQ0mL9fPzwhz8kIyOjyxjN3Xffze23305aWhqRkZG8+OKLABw7dox77rmHdevWUVpayh133IHT6cTlcnHTTTdx5ZVX9jvm3mjhM7TwmfKuVoeLfxRU8faeMjbsLaemoZUgfx8WZoxn+cw4LkqLJipkcOvef/7550ybNm1Q31NZd51deeWV7hsVhpLufia08JlSQ1hzm5MPD1axfk8pm/aWc6LZQXCAL0umxbI8M45Lp8QwNkD/e6qRQX+SlRokja0O3t9fybrdpby3r4KGVifjgvxYOj2O5ZlxXJQeTZC/9+ewjCTZ2dnuy0vt/vSnPzFz5kwvRXRmSUlJQ7I3c6400SjlQSea23j38wrW7ynlbwcqaW5zERUcwNWzJ7A8M56c1KhO9VnUQNu2bZu3Q1BoolFqwNU2trJhbzlv7ynj7weraHW6GB8ayE1Zk1ieGc/cpAj8NLmoUUQTjVIDoPJkCxv2lvH2njL+UVCN0yVMDB/DP+VMZvnMOOZMisDHR1c8VqOTJhqlzlJpXRNv7ylj/Z4ythfVIALJ0cGsviSF5ZlxzJwYpnValEITjVL9cqSmkfV7Slm/p4ydxdYaWRmxIXx1cTorZsYxJTZUk4tSp9BEo1QvCirr7Z5LKXuOWotLzpgwjm9eMYVlmXGkxoR4OcKRp7a2lr/85S9nXSZg9erVA1YmYO3ateTl5fHrX/96QI53thYuXMjPfvYzsrJ6nbYCWPVo/umf/okdO3YQFRXFSy+91GVF6nZJSUmEhobi6+uLn59fv2re9JUmGqVOISLsLz/J+t1WcjlQbi3BPicxnG+vmMqyGfEkRo3uWieepvVozl1f6tG0O9Nq1wNBb31RCiu5fFpSy0/e3sfi//c3lj35Ib969yDhYwN4/KrpbHlkMX/9ygJWX5KqSWYQaD2awalHM1i0R6NGLZdL2HnkuN1zKeNobRO+PoaclCjuviiZy2fEMj7Ue1Umh4z1D0PZ7oE9ZtxMWL6mx5e1Hs3g1aMxxnD55ZdjjOHee+9l9erVvZ6P/tJEo0YVp0vIPVTD23tKefuzMspPtODva7goLZqvXZbO0mmxRASP7AUrhxutR+PZejQfffQREyZMoKKigqVLlzJ16lQuueSSXs9Jf2iiUSNem9PFloJq1u8pZcNn5VQ3tBLo58PCKTEsz4xn8bTxjBvA+i0jzhl6HoNB69F4th7NhAkTABg/fjzXXnstubm5A55odIxGjUjNbU427S3n317+hKwfbuKfns3ljV3HyEmN4je3ns/Hjy3ld7dn8YU5EzXJDEGn1qN59tln3eMQR48epaKigmPHjjF27FhWrVrFgw8+yMcff3zavt2pqqrC5XJx/fXX84Mf/MC9X3s9GqDHejRNTU289tprLFiwoNv3764eTX+116MBeqxH89FHH5Gfnw9AY2MjBw4cOO047fVo2j9Pd/VoGhoa3OeqoaGBDRs2DHjRM/BSj8YYEwm8BCQBRcBNInK8m3aJwB+ASYAAK0SkyBjzZyALaANygXtFpM0YcxvQXrWnHviyiHzi4Y+jhoimVifv769g/Z4y3t1XQX2Lg9AgP5ZOi2VZZhyXZMToopXDhNajGZx6NOXl5Vx77bUAOBwObr31VpYtW9bvmHvjlXo0xpifAjUissYY8zAQISKnlXUzxrwP/EhENhpjQgCXiDQaY1YA6+1mfwE+EJHfGmMuBD4XkePGmOXA90Qku7d4tB7N8HWyuY1391Xw9p4y3ttfQXObi4ix/lwxI45lmXFcmBpNgJ923PtL69F4h9ajGVjXAAvtx88B79PREwHAGDMd8BORjQAi4r5/T0TWdWqXCyTY2//R6RBb27erkaW2sZWN9qKVH9qLVsaEBnLjBZNYnhnHvORIXbRSqSHEW4kmVkRKAUSk1Bgzvps2GUCtMeZVIBnYBDwsIs72BsYYf+B24Gvd7H83Hb2e0xhjVgOrARITE8/2c6hBUlXfwobPylm/p5QtBdU4XMKEsCBWzbcWrbwgURetVKfTejRDg8cSjTFmExDXzUuP9vEQfsDFwBygGGtM507gmU5tnsK6bPbhKe+9CCvRdB1F60REngaeBuvSWR9jUoOorK6Zdz6zZufnHqrBJTA5aiz3XGwtWjkrQRetVGem9WiGBo8lGhG5rKfXjDHlxph4uzcTD1R006wE2CkihfY+rwHzsRONMeZxIAbocs+jMWYW1g0Ey0WkekA+jBo0R2oaeeezMtbtLuVje9HKtPEhPLAojWWZ8UyL10UrlRpuvHXp7A3gDmCN/f31btpsByKMMTEiUgksBvIAjDH3AFcAS0TE1b6DfZfaq8DtInL6/X5qSCqsrGf9HquWy+6j1uzq6fHj+LelGSyfGUfa+FAvR6iUOhfeSjRrgJeNMXdjXRa7EcAYkwXcJyL3iIjTGPMgsNlYf8LuAH5v7/9fwGFgi/3X7asi8gTwXSAKeMre7ujLHRFqcIkIB8rrWb+nlLf3lLGvzLqP/7xJ4Ty8fCrLM+OYHBXs5SiVUgPFK4nGvqS1pJvtecA9nZ5vBGZ1067buEXkns77q6FDRPjs2AmrlsvuMgqrGjAGsiZH8N0rp7MsM44J4WO8HaZSygP0HlDlMS6X8HHxcX701l4u+Y/3uPI//85//a2Q+PAgfvCFTLY9soT/ue9C7rooWZOM6qK9TMDZePLJJ7td8fhsrV27lgceeGDAjne2Oq8u3RctLS3cfPPNpKWlkZ2dTVFR0Wlt9u/fz+zZs91f48aN48knnxzAqC261pkaUE6XsL2ohrftMZeyE834+xoWpEXzwKI0lk6PI1IXrVS90Ho0564v9WimTJnCrl27AKt8wsSJE90rBQwk7dGoc9bmdPHhwUq+/dfdZP/7Jr749Fb+klvMzIQwfn7TeeR9ZylrvzSPm+cmapJRfaL1aAa/Hs3mzZtJTU1l8uTJPf/DnCXt0aiz0uJw8lF+Fet2l7Hp83JqG9sYG+DLoinjWT4zjkVTxhMcqD9eI8FPcn/Cvpp9A3rMqZFTeWjeaatOuWk9msGrR9PuxRdf5JZbbun1XJwN/U2g+qyp1cnfDtiLVn5ewckWB6GBflw23Vq08lJdtFJ5gNaj8Ww9mvZjvPHGG+4FRgeaJhp1RvUtDnvRylLe21dJU5uT8LH+LJ8Zx/LMeC5MiyLQT5PLSHamnsdg0Ho0nq1HA7B+/XrOP/98YmNjz3jMs6WJRp2mrrGNTZ+Xs35PGR8crKTV4SI6JJDrzp/I8sx4slMi8ddFK5UHnVqP5rHHHuO2224jJCSEo0eP4u/vj8PhIDIyklWrVhESEsLatWu77NvTJaKqqioCAgK4/vrrSU1N5c477wQ66tHMmzevx3o0Y8aM4bXXXuPZZ5/l2LFjp71/d/Vobrjhhn599vZ6NDk5OT3Wo7n//vvJz88nLS2NxsZGSkpKyMjI6NKuvR5NTk5Oj/Vo2r3wwgseu2wGmmiUrbq+hY17y1m3p4x/5FfhcAnxYUHclp3I8sx4Lpgcga8uWqkGidajGZx6NGAVTtu4cSO/+93v+h1rX3mlHs1QM1rr0ZSfsBet3F3GtkPVuAQSI8eyPNOq5XJeQriuiDxKaT0a79B6NGpEKDne6J7jsqP4OCKQGhPMVxamsSwzjhkTxumilUqpAaWJZhQoqmpg/R5ruf1PS6xbMKfGhfL1JRmsmBlHeqwuWqlGJq1HMzRoohmhDpafZN1uK7m0L1o5KyGMh5ZZi1YmReuilWrk03o0Q4MmmhGifdHKt+2eS0FlA2AtWvmdldNYlhlHQsToXpJDKeUdmmiGMRFh15FaO7mUUVzTiI+B7OQo7rgwiStmxBE7LsjbYSqlRjlNNMOM0yXsOHycdbtLeeezMkrrmvHzMVyYFs1XFqaydHosUSGBvR9IKaUGiSaaYcDhdLG1sIb1e0p557NyqupbCPDz4ZL0GB68fAqXTYslbKy/t8NUSqlu6fTuIarF4eS9fRV865VPmPujTax6ZhuvfnyUeckR/OqWOXz82FL+cEcW11+QoElGjThaj+Z0nqhHA/DLX/6SzMxMZsyY4ZFaNKA9miGluc3J3w5Usn53KZvtRStDAv1YMm08yzPjuDRjPGMCdF0xNfJpPZpz15d6NHv27OH3v/89ubm5BAQEsGzZMlauXEl6evqAxqKJxssaWhy8t7+C9bvLeG9/BY2tTsLG+HNFZhwrZsaxIC1aF61UXlX27/9Oy+cDWyYgcNpU4r797R5f71yPZunSpYwfP56XX36ZlpYWrr32Wr7//e/T0NDATTfdRElJCU6nk8cee4zy8nJ3PZro6Ohul6BxOp3cfffd5OXlYYzhrrvu4hvf+AYLFy7kZz/7GVlZWVRVVZGVleXuBbTXozl06BC33norjz/+eLfvf/PNN/PEE0/wf//3fzQ1NXHhhRfyu9/9DmMMCxcuZM6cOezYsYPKykqef/55fvzjH7N7925uvvlmfvjDH1JUVMSyZcvIzs5m586dZGRk8Pzzz5+WNDds2MDjjz9OS0sLqamp/PGPfyQkJKRLm9dff53vfe97gFWP5oEHHkBEukzI/vzzz5k/f777+Jdeeil//etf+da3vnU2/6w90kTjBXVNbWxuX7TyQCUtDhfRIQF8Yc5ElmfGMT8lShetVKOa1qMZnHo0mZmZPProo1RXVzNmzBjWrVtHVlavK8r0myaaQVLT0MrGvdZtyB/lV9HmFOLGBXHLvESWZcYxNylSF61UQ9KZeh6DQevReK4ezbRp03jooYdYunQpISEhnHfeefj5DXxa0ETjQRXti1buKWPboRqcLiEhYgx3XpjE8pnxzNZFK5Xqldaj8Ww9mrvvvpu7774bgG9/+9skJCSc8bhnQxPNADta22QvWllK3mFr0cqU6GDuvSSFFTPjddFKpfpA69EMXj2aiooKxo8fT3FxMa+++ipbtmzpV7x9oYlmAByubl+0soxPjljXe6fGhfK1Jeksz4wnIzZEk4tS/aD1aAavHs31119PdXU1/v7+/OY3vyEiIqLfMfdG69Fw9vVoPsqv4kdvfc7e0hMAzJwYxrLMOJZnxpESE9LL3koNXVqPxju0Ho06TXCgH0H+Pjy6wlq0clLk6L5vXymluqOJ5hzMnhTOq19Z4O0wlFI90Ho0Q4MmGqXUiKX1aIYGnRWolOqWjt+qduf6s6CJRil1mqCgIKqrqzXZKESE6upqgoLOvraVVy6dGWMigZeAJKAIuElEjnfTLhH4AzAJEGCFiBQZY/4MZAFtQC5wr4i0ddpvLrAVuFlEXjn1uEqpM0tISKCkpITKykpvh6KGgKCgoHOayOmtMZqHgc0issYY87D9/KFu2j0P/EhENhpjQgCXvf3PwCr78V+Ae4DfAhhjfIGfAO94MH6lRjR/f3+Sk5O9HYYaIbx16ewa4Dn78XPAF05tYIyZDviJyEYAEakXkUb78TqxYfVoOqfarwL/C1R4MH6llFJ95K1EEysipQD29/HdtMkAao0xrxpjdhpj/sPurbgZY/yB24G37ecTgWuB/+otAGPMamNMnjEmTy8PKKWU53js0pkxZhMQ181Lj/bxEH7AxcAcoBhrTOdO4JlObZ4CPhCRD+3nTwIPiYiztyVfRORp4GmwVgboY0xKKaX6yWOJRkQu6+k1Y0y5MSZeREqNMfF0f5mrBNgpIoX2Pq8B87ETjTHmcSAG6Lykaxbwop1kooEVxhiHiLx2plh37NhRZYw53PdP10U0UHWW+3rSUI0Lhm5sGlf/aFz9MxLjmtyXRt66GeAN4A5gjf399W7abAcijDExIlIJLAbyAIwx9wBXAEtEpP0GAUTEPXppjFkLvNlbkrH3iznbD2KMyevLWj+DbajGBUM3No2rfzSu/hnNcXlrjGYNsNQYcxBYaj/HGJNljPkDgIg4gQeBzcaY3YABfm/v/19ALLDFGLPLGNN7EQqllFJe4ZUejYhUA0u62Z6Hdaty+/ONwKxu2vUat4jceW5RKqWUGgi6MsC5e9rbAfRgqMYFQzc2jat/NK7+GbVxaT0apZRSHqU9GqWUUh6lieYMjDHLjDH7jTH59lI5PbW7wRgjxpisTtsesffbb4y5YijEZYxJMsY02TdQ7DLG9DqxdSDjMsbcaYyp7PT+93R67Q5jzEH7644hFJez0/Y3BjMuu81Nxpi9xpjPjDF/6bTda+erl7i8dr6MMb/o9N4HjDG1nV7z5s/XmeLy5vlKNMa8Z6wJ8Z8aY1Z0em1gf3+JiH518wX4AgVAChAAfAJM76ZdKPAB1iKeWfa26Xb7QCDZPo7vEIgrCdjjrfOFNeH2193sGwkU2t8j7McR3o7Lfq3ei+crHdjZfi6A8UPkfHUbl7fP1yntvwo8OxTOV09xeft8YY3NfNl+PB0o6vR4QH9/aY+mZ/OAfBEpFJFW4EWsNdpO9QPgp0Bzp23XAC+KSIuIHALy7eN5Oy5P6mtc3bkC2CgiNWKt4r0RWDYE4vKkvsT1z8Bv7HOCiLRPbPb2+eopLk/q77/jLcAL9mNvn6+e4vKkvsQlwDj7cRhwzH484L+/NNH0bCJwpNPzEnubmzFmDjBJRN7s775eigsg2e4q/80Yc/EAxdSnuGzX2930V4wxk/q572DHBRBkrDXxthpjTlv81cNxZQAZxpiP7Pdf1o99vREXePd8AWCMmYz1l/i7/d13kOMC756v7wGrjDElwDqs3lZf9+0XLSoNcqMAAAZuSURBVOXcs+4WS3PfomeM8QF+gXXZpV/7nqNziasUSBSRamPMBcBrxpgZInLC03HZ/g94QURajDH3Ya3cvbiP+3ojLrDO1zFjTArwrjFmt4gUDFJcfliXqRZirVD+oTEms4/7DnpcIlKLd89Xuy8Cr4g16bu/+/bXucQF3j1ftwBrReT/GWNygD956udLezQ9K8EquNYugY6uJVhjIJnA+8aYIqx12N4w1sB7b/t6JS67K1wNICI7sK69ZgxSXIhItYi02E9/D1zQ1329FBcicsz+Xgi8j7XI66DEZbd5XUTa7EsY+7F+wXv1fJ0hLm+fr3ZfpOvlKW+fr57i8vb5uht42X7/LUAQ1rpnA3++PDEQNRK+sP5qK8Tq6rYPps04Q/v36Rh0n0HXwbRCBu5mgHOJK6Y9DqxBwqNA5GDFBcR3enwtsNV+HAkcwhqojbAfD4W4IoBA+3E0cJAzDPR6IK5lwHOd3v8IEDUEzldPcXn1fNntpmBV7TWdtnn1fJ0hLm//fK0H7rQfT8NKJgYP/P465w80kr+AFcABrL/8H7W3PQFc3U3b97F/odvPH7X32w8sHwpxAdcDn9k/RB8DVw1mXMCPO73/e8DUTvvehTXomA98aSjEBVwI7La37wbuHuS4DPBzYK/9/l8cIuer27i8fb7s598D1nSzr9fOV09xeft8Yd1d9pH9/ruAyzvtO6C/v3RlAKWUUh6lYzRKKaU8ShONUkopj9JEo5RSyqM00SillPIoTTRKKaU8ShONUkopj9JEo0YdY0ycMeZFY0yBvdT9OmNMtyskGKu0wp7BjtF+7/r/397ZhGhZRXH898OPGHOlWUgZQUWSVIswnAwhzNkEkRQMEZREtQo3fYFFES1KCoKKoqCsTFtYWtHCcSospmayzGnULCKhgigi3FiklqfFva88TjM5U41jvOcHl/fe8zz3az6e8957H87/H9QZ93jVVePtJ0nGQzqapK1QBTYBWyPi7Ig4H1gFnDa5I5tURnQ0FvIZkfxr8o8oaTcuBw5FxBHRt4gYBPrUR9Rd6k61e3hFdYG6rYpUDannVvvr6vYqAnZr4/796up67W31EnWrule9qt6zQn1D3VxFpu4fadDqnerHtd8HjjHHqeqLjWjUM9Sl6qZGe8vUjerDQEed07q6ItqjPkWJHjFP7VL71U/VDerM2sbFNQr4drVHnTvWX0LSZvyXIQ8yZTrRE7ASeGwE+zUUnZIplNXNt8BcGmJxwBPA9TU/Heio+Vn1swPYBcyu5aCG76CsorYA04CLgMFqX0GJqj27Ub8VMmh//eyiiFRJ+XL4FrBklPmdVftdXMvPA3fUul8Ac6p9PTUEEQ3xrVr/MLColk+hCOidXMt3A/fVeXzYaK+bhqBXpkzNlDIBSVK4jCIV8Afwo/oesBAYatzTD9yjngFsjIivqn2lurzm51EiGf8MHAQ2V/tO4EBEHFJ3Uh7oLXqjRtVWN9axfNK43lXTjlqeWft4f5S5fBcRH9T8y8DKiHhUXUvRH1kDdAI3jFL/m4gYqPlF1JhYZdeR6fXncB4lSnhvtU+hOMwk+QvpaJJ2Yzdw7Qj2kTQ4jiIi1qsfAVcCPerNlG//VwCdEfGrupUSbh3KFl0rmOBh4EBt57Da/N8bHnBweFngoYh45lhjPEZ7ayjaO78BGyLi91Hq/zKs796IuO6oAekFwO6I6BzjmJI2Js9oknbjXeAk9ZaWQV0I7AO61SnqHGAJsK1ZsYpT7Y2Ix4E3gQspErj7qpOZT1kBjJdl6iy1A7iaElG3SQ9wU+Ns5HT11L9p78wqZAVF3KoPjmiffA/cC7zQuP+QOm2UtgaAxeo5te8Z9Q29L4E5rX7UaeqCsU03aTfS0SRtRV1hLKc83L9Wd1NCuK+nbJN9RnFGd0XED8OqdwO71EFgPvASZWtsqjoEPEh5MI+XPmAtJVT7axHR3DYjIrbU8fXXbbdXKQJ3o7EHuLGOaRbwdOPaOsrW2ucN27PAkLpueEMR8RPlHOmV2t4ARUbhIGVluFpthZm/dOxTTtqJlAlIkklEXUE5/L/tOPX3JLAjIp47Hv0lCeQZTZK0Dep2yvnL7ZM9lqS9yBVNkvwPUWcD74xwaWnrDbYkOVFIR5MkSZJMKPkyQJIkSTKhpKNJkiRJJpR0NEmSJMmEko4mSZIkmVDS0SRJkiQTyp8XSLDyc76pMwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x9d29bda8d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best score: 0.613463\n",
      "Colsample_bytree: 0.7\n",
      "Subsample: 0.8 \n"
     ]
    }
   ],
   "source": [
    "test_means = cv_result[\"test-mlogloss-mean\"]\n",
    "test_stds = cv_result[\"test-mlogloss-std\"]\n",
    "\n",
    "train_means = cv_result[\"train-mlogloss-mean\"]\n",
    "train_stds = cv_result[\"train-mlogloss-std\"]\n",
    "\n",
    "test_scores = np.array(test_means).reshape(len(subsample), len(colsample_bytree))\n",
    "train_scores = np.array(train_means).reshape(len(subsample), len(colsample_bytree))\n",
    "\n",
    "# 记录最佳参数\n",
    "best_subsample = \"\"\n",
    "best_colsample_bytree = \"\"\n",
    "best_score = min(test_means)\n",
    "\n",
    "for i, value in enumerate(subsample):\n",
    "    plt.plot(colsample_bytree, -test_scores[i], label= 'test_subsample:'   + str(value))\n",
    "    \n",
    "    for j in range(0, len(test_scores[i])):\n",
    "        if(test_scores[i][j] == best_score):\n",
    "            best_colsample_bytree = str(colsample_bytree[j])\n",
    "            best_subsample = str(value)\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'Colsample_bytree' )                                                                                                      \n",
    "plt.ylabel( 'Log Loss' )\n",
    "plt.savefig( 'subsample_vs_colsample_bytree1.png' )\n",
    "\n",
    "plt.show()\n",
    "print(\"Best score: %f\" % best_score)\n",
    "print(\"Colsample_bytree: %s\\nSubsample: %s \" % (best_subsample, best_colsample_bytree))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "cv获取的最佳subsample为 0.8, colsample_bytree 为 0.7。由于计算资源有限，暂时不再调整。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
